import java.util.*;

public class question_15 {
}
class Solution_15 {
    public List<List<Integer>> threeSum(int[] nums) {
//        //先去重
//        HashSet<Integer> arr = new HashSet<>();
//        for (int i = 0; i < nums.length; i++) {
//            arr.add(nums[i]);
//        }
//        Object[] obj = arr.toArray();//先讲set集合转为Object对象数组（向上转型）
//        int err[] = new int[obj.length];
//        for (int i = 0; i < obj.length; i++) {
//            err[i] = (int) obj[i];//将Object对象数组转为整型数组（强制向下转型）
//        }
//
//
//        //去重完毕
//        LinkedList<List<Integer>> result = new LinkedList<>();
//        for (int i = 0; i < err.length; i++) {
//            for (int j = i+1; j < err.length; j++) {
//                for (int k = j+1; k < err.length; k++) {
//
//                    if(err[i]+err[j]+err[k]==0){
//                        List<Integer> integers = new LinkedList<>();
//                        integers.add(err[i] );
//                        integers.add(err[j] );
//                        integers.add(err[k] );
//                        result.add(integers);
//                    }
//
//                }
//            }
//        }
//        return result;
        //以上的做法是错误的思路，下面的是正确的思路
        //先返回特殊情况
        if(nums==null||nums.length==0)
            return new LinkedList<>();
        //三数之和通过三重for循环去枚举求解并不困难，问题在于如何去重重复的答案
        //第一步，使用工具类对原数组进行排序
        Arrays.sort(nums);
        //接下来是三重for把结果添加到list集合中去
        List<List<Integer>> result=new LinkedList<>();
        HashMap<String,List<Integer>> temp=new HashMap<>();
        int len=nums.length;
        for (int i = 0; i < len; i++) {
            for (int j = i+1; j < len; j++) {
                for (int k = j+1; k < len; k++) {

                    if(nums[i]+nums[j]+nums[k]==0){
                        List<Integer> l = new LinkedList<>();
                        l.add(nums[i] );
                        l.add(nums[j] );
                        l.add(nums[k] );
                       String key=Integer.toString(nums[i])+Integer.toString(nums[j])+Integer.toString(nums[k]);
                       temp.put(key,l);
                    }

                }
            }
        }
//        Collection<List<Integer>> values = temp.values();
        Collection<List<Integer>> values = temp.values();
        for(List<Integer> o:values){
            result.add(o);
        }
        return result;

    }

    public static void main(String[] args) {
//        int arr[]=new int[]{-1,0,1,2,-1,-4};
//        Solution_15 s = new Solution_15();
//        List<List<Integer>> lists = s.threeSum(arr);
//        System.out.println(lists);
//        HashSet<people> hashset = new HashSet<>();
//        hashset.add(new people("haha"));
//        hashset.add(new people("haha"));
//        System.out.println(hashset);
        Solution_15 solution_15 = new Solution_15();
        int arr[]={-1,0,1,2,-1,-4};
        List<List<Integer>> lists = solution_15.threeSum(arr);
        System.out.println(lists);


    }
}
class people{
    public String name;

    public people(String name) {
        this.name = name;
    }
    public people(){
    }
}